package com.atnjupt.crud.controller;

import com.atnjupt.crud.bean.Employee;
import com.atnjupt.crud.bean.Msg;
import com.atnjupt.crud.service.EmployeeSerivice;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Wizarder
 * @create 2021-08-29 16:02
 */
@Controller
public class EmployeeController {
    @Autowired
    private EmployeeSerivice employeeSerivice;

    /**
     * 单个删除和批量删除
     * @param id
     * @return
     */
    @RequestMapping(value = "/emp/{ids}",method = RequestMethod.DELETE)
    @ResponseBody
    public Msg deleteEmp(@PathVariable("ids")String id){
        //如果包含字符“-”就批量删除，否则单个删除
        if (id.contains("-")){
            //创建一个List存储删除的id
            List<Integer> deleteIds = new ArrayList<>();
            //把字符串里的id存储到List中
            String[] split = id.split("-");
            for (String s:split){
                deleteIds.add(Integer.parseInt(s));
            }
            employeeSerivice.deleteBatch(deleteIds);
        }else{
            int deleteId = Integer.parseInt(id);
            employeeSerivice.deleteEmp(deleteId);
        }
        return Msg.success();
    }

    /**
     * 更新员工
     * 如果ajax直接发送PUT请求，我们封装的数据为：
     * Employee
     *      {empId=1036, empName='null', gender='null', email='null', dId=null, department=null}
     * 而在请求头中是有数据的，email=ast12123%40nn.com&gender=M&dId=1
     *
     * 问题就在于请求体中有数据，但是Employee对象封装不上
     * 这样的话SQL语句就变成 update tbl_employee where emp_id = 1014 ，没有set字段，所以sql语法就有问题
     *
     * 而封装不上的原因在于
     * Tomcat:
     *      tomcat会将请求体中的数据封装为一个map，request.getParameter("empName")就会从这个map中取值
     *      而SpringMVC封装POJO对象的时候，会把POJO中每个属性的值调用request.getParameter()方法来获取
     *
     *      但是如果AJAX发送PUT请求，tomcat看到是PUT请求，就不会将请求体中的数据封装为map，
     *      只有POST请求才会封装请求体为map
     *
     *解决方案：
     * 我们要能支持直接发送PUT之类的请求，还要封装请求体中的数据
     *      在web.xml中配置上HttpPutFormContentFilter过滤器
     *      他的作用是将请求体中的数据解析包装成map
     *      request被重新包装，request.getParameter()被重写，就会从自己封装的map中取出数据
     * @param employee
     * @return
     */
    @RequestMapping(value = "/emp/{empId}",method = RequestMethod.PUT)
    @ResponseBody
    public Msg updateEmp(Employee employee){
        System.out.println(employee);
       employeeSerivice.updateEmp(employee);
        return Msg.success();
    }
    /**
     * 根据id查询员工
     * @param id
     * @return
     */
    @RequestMapping(value = "/emp/{id}",method = RequestMethod.GET)
    @ResponseBody
    public Msg getEmp(@PathVariable("id") Integer id){
     Employee employee =   employeeSerivice.getEmp(id);
     return Msg.success().add("emp",employee);
    }

    /**
     * 检查用户名字是否重复，名字是否合法添加一个后端校验
     * @param empName
     * @return
     */
    @RequestMapping("/checkEmpName")
    @ResponseBody
    public Msg checkEmpName(@RequestParam("empName") String empName){
        //添加一个后端校验
        String regx = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]{2,5})";
        boolean matches = empName.matches(regx);
        if (matches == false){
            return Msg.fail().add("msg","用户名应为字母6到9或中文2到5位组成");
        }
        //true表示有用户名
        Boolean b =  employeeSerivice.checkEmpName(empName);
        if (b){
           return Msg.fail().add("msg","用户名已经存在");
       }else{
           return Msg.success();
       }
    }

    /**
     * 添加一个用户
     *要支持JSR303，需要导入Hibernate-Validator包
     * @param employee
     * @return 返回添加是否成功信息
     */
    @RequestMapping(value = "/emp",method = RequestMethod.POST)
    @ResponseBody
    public Msg saveEmp(@Valid Employee employee, BindingResult result){
        //如果出错
        if (result.hasErrors()){
            // 校验失败，在模态框中显示校验失败的错误信息
            Map<String,Object> map = new HashMap<>();
            List<FieldError> fieldErrors = result.getFieldErrors();
           for (FieldError fieldError:fieldErrors){
               String defaultMessage = fieldError.getDefaultMessage();
               String field = fieldError.getField();
               map.put(field,defaultMessage);
           }
           return Msg.fail().add("errorMap",map);
        }
        employeeSerivice.saveEmp(employee);
        return Msg.success();
    }

    /**
     * 返回Msg的json字符串
     * @param pn 传入当前页码
     * @return 返回Msg的json字符串
     */
    @RequestMapping("/emps")
    @ResponseBody
    public Msg getEmps(@RequestParam(value = "pn",defaultValue = "1")Integer pn){
//      引入pageHelper进行分页处理
        PageHelper.startPage(pn,5);
//        分页完之后的查询就是分页查询
        List<Employee> employeeList =  employeeSerivice.getAll();
//        分页查询完之后，可以使用pageInfo来包装查询后的结果，
//        只需要将pageInfo交给页面就行
//        pageInfo封装了详细的分页信息，包括我们查询出来的数据
//        比如总共有多少页，当前是第几页等。。。
//        想要连续显示5页，就加上参数5即可
        PageInfo pageInfo = new PageInfo(employeeList,5);
        return Msg.success().add("pageInfo",pageInfo);
    }

    /**
     * 分页查询
     * @param pn 传入当前页码
     * @param model 存储域数据
     * @return 跳转list页面
     */
//    @RequestMapping("/emps")
    public String getEmps(@RequestParam(value = "pn",defaultValue = "1")Integer pn, Model model){
//      引入pageHelper进行分页处理
        PageHelper.startPage(pn,5);
//        分页完之后的查询就是分页查询
      List<Employee> employeeList =  employeeSerivice.getAll();
//        分页查询完之后，可以使用pageInfo来包装查询后的结果，
//        只需要将pageInfo交给页面就行
//        pageInfo封装了详细的分页信息，包括我们查询出来的数据
//        比如总共有多少页，当前是第几页等。。。
//        想要连续显示5页，就加上参数5即可
      PageInfo pageInfo = new PageInfo(employeeList,5);
      model.addAttribute("pageInfo",pageInfo);
      return "list";
    }
}
